/*
    使用mysql官方提供的库，通过c/c++来操作数据库
*/
#include <iostream>
#include <string>
#include <mysql/mysql.h>

const std::string host = "139.9.216.193"; //远端服务器ip
unsigned int port = 3306; // 服务器mysqld端口号
const std::string user = "oj_server"; // 登录用户
const std::string password = "123456789"; // 登陆密码
const std::string db = "oj_serverdb"; //要连接的数据库

int main()
{
    // 1、获取/初始化句柄（类似于文件结构体）
    MYSQL* mysql = mysql_init(nullptr); 
    if(mysql == nullptr)
    {
        std::cerr << "句柄初始化失败\n";
        return 1;
    }

    // 2、连接数据库
    if(nullptr == mysql_real_connect(mysql, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0))
    {
        std::cerr << "数据库连接失败\n";
        return 1;
    }

    // 3、设置连接后编码规则是utf8，可以支持中文(默认是latin1)
    mysql_set_character_set(mysql, "utf8");

    // 4、操作
    std::string line;
    while(true)
    {
        std::cout << "mysql>>>";
        std::getline(std::cin, line);
        if(line.empty())
            continue;
        if(line == "quit")
        {
            std::cout << "bye bye\n";
            break;
        }

        if(0 == mysql_query(mysql, line.c_str())) //增删改语句一旦执行，要么执行成功，要么失败
        {
            std::cout << line << " success\n";
            if(line.find("select") != std::string::npos) //查询语句，执行成功要获取查询结果
            {
                //select执行成功会将结果保存在mysql句柄中，需要自己提取
                MYSQL_RES* res = mysql_store_result(mysql); // 将句柄中的数据转储到结果集中

                my_ulonglong rows = mysql_num_rows(res);
                my_ulonglong fileds = mysql_num_fields(res);
                std::cout << "rows: " << rows << ",fileds: " << fileds << std::endl;

                //字段
                //内容
                for(int i = 0; i < rows; i++)
                {
                    MYSQL_ROW r = mysql_fetch_row(res); // 获取结果集中的一行内容
                    for(int j = 0; j < fileds; j++)
                    {
                        std::cout << r[j] << "\t";
                    }
                    std::cout << "\n";
                }
                mysql_free_result(res); //释放结果集
            }
        }
        else
        {
            std::cerr << line << " false\n";
        }
    }

    mysql_close(mysql);
    return 0;
}
